package com.ipartek.formacion.bbdd;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.ipartek.formacion.bean.Persona;
import com.ipartek.formacion.bean.Principal;
import com.ipartek.formacion.enumeraciones.Rol;

public class PersonaBD {
	// parametros configuracion base datos
	private static final String DRIVER_MYSQL = "com.mysql.jdbc.Driver";
	private static final String DB_NAME = "migracion";
	private static final String DB_PORT = "3306";
	private static final String DB_SERVER = "localhost";
	private static final String DB_USER = "root";
	private static final String DB_PASS = "curso";
	private static final String DB_URL = "jdbc:mysql://" + DB_SERVER + ":"
			+ DB_PORT + "/" + DB_NAME;

	private static String TABLE_NAME = "personas";
	private static Connection con = null;

	/**
	 * insertar persona
	 * 
	 * @param persona
	 */
	public static void InsertarPersona(Persona persona) {

		try {

			// comprobar que no exista en la base de datos
			String rolString = null;
			String cadenaBusqueda = "SELECT dni FROM " + TABLE_NAME
					+ " WHERE dni = '" + persona.getDni() + "'";
			PreparedStatement stm = con.prepareStatement(cadenaBusqueda);
			ResultSet rs = stm.executeQuery();
			// ya existe, por lo que no hace falta guardar, error
			if (rs.next()) {
				Principal.log.error("El dni " + persona.getDni()
						+ " ya existe en la base de datos.");
			} else { // como no existe en la base de datos lo insertamos
				String cadenaSQL = "INSERT INTO "
						+ TABLE_NAME
						+ " (dni,nombre,apellido1,apellido2,edad,email,rol) VALUES (?,?,?,?,?,?,?)";

				PreparedStatement st = con.prepareStatement(cadenaSQL);

				st.setString(1, persona.getDni());
				st.setString(2, persona.getNombre());
				st.setString(3, persona.getApellido1());
				st.setString(4, persona.getApellido2());
				st.setInt(5, persona.getEdad());
				st.setString(6, persona.getEmail());
				if (persona.getRol() == Rol.TRABAJADOR) {
					rolString = "TRABAJADOR";
				} else if (persona.getRol() == Rol.CLIENTE) {
					rolString = "CLIENTE";
				} else if (persona.getRol() == Rol.JEFE) {
					rolString = "JEFE";
				}
				st.setString(7, rolString);
				st.executeUpdate();

				con.commit();
			}
		} catch (SQLException ex) {
			SQLException e = ex;
			while (ex != null) {
				Principal.log.error("Error insercion : " + ex.getMessage()
						+ "SQLState: " + ex.getSQLState() + "ErrorCode: "
						+ ex.getErrorCode());
				ex = ex.getNextException();

			}
		} catch (Exception ex) {
			Principal.log.error("Se ha producido una excepcion "
					+ ex.getMessage());

		} finally {
			try {
				con.close();
			} catch (SQLException e) {

			}
		}

	}

	/**
	 * conectar a base de datos
	 */
	public static void abrirConexion() {
		try {
			// registrar driver JDBC for MySQL
			Class.forName(DRIVER_MYSQL);
			// establecer conexion
			// Get a connection to the database sakila
			con = DriverManager.getConnection(DB_URL, DB_USER, DB_PASS);
			// Poner Autocommit a false
			con.setAutoCommit(false);
		} catch (SQLException e) {
			Principal.log.error("SQLException [" + e.getErrorCode() + "] "
					+ e.getMessage());
		} catch (ClassNotFoundException e) {
			Principal.log.error("ClassNotFoundException driver no encontrado "
					+ DRIVER_MYSQL);
		} catch (Exception e) {
			Principal.log.error("Excepcion general " + e.getMessage());
		}
	}

	/**
	 * cerrar base de datos
	 */
	public static void cerrarConexion() {

		try {
			if (con != null && !con.isClosed()) {
				con.close();
			}
		} catch (SQLException e) {
			Principal.log.error("SQLException [" + e.getErrorCode() + "] "
					+ e.getMessage());
		}
	}
}
